#!/bin/bash

# 系统监控脚本
set -e

# 配置
LOG_FILE="/var/log/print-ad-monitor.log"
ALERT_EMAIL="admin@example.com"

# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}

# 检查Docker容器状态
check_containers() {
    log "检查Docker容器状态..."
    
    containers=("print-ad-mysql" "print-ad-redis" "print-ad-backend" "print-ad-nginx")
    
    for container in "${containers[@]}"; do
        if ! docker ps | grep -q $container; then
            log "警告: 容器 $container 未运行"
            # 尝试重启容器
            docker-compose restart $container
            sleep 10
            
            if ! docker ps | grep -q $container; then
                log "错误: 容器 $container 重启失败"
                # 发送告警邮件
                echo "容器 $container 重启失败，请立即检查" | mail -s "系统告警" $ALERT_EMAIL
            else
                log "容器 $container 重启成功"
            fi
        else
            log "容器 $container 运行正常"
        fi
    done
}

# 检查磁盘空间
check_disk_space() {
    log "检查磁盘空间..."
    
    disk_usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
    
    if [ $disk_usage -gt 80 ]; then
        log "警告: 磁盘使用率 ${disk_usage}%"
        echo "磁盘使用率过高: ${disk_usage}%" | mail -s "磁盘空间告警" $ALERT_EMAIL
    else
        log "磁盘使用率正常: ${disk_usage}%"
    fi
}

# 检查内存使用
check_memory() {
    log "检查内存使用..."
    
    memory_usage=$(free | awk 'NR==2{printf "%.0f", $3*100/$2}')
    
    if [ $memory_usage -gt 85 ]; then
        log "警告: 内存使用率 ${memory_usage}%"
        echo "内存使用率过高: ${memory_usage}%" | mail -s "内存使用告警" $ALERT_EMAIL
    else
        log "内存使用率正常: ${memory_usage}%"
    fi
}

# 检查应用健康状态
check_app_health() {
    log "检查应用健康状态..."
    
    # 检查后端API
    if curl -f -s http://localhost:3000/health > /dev/null; then
        log "后端API健康检查通过"
    else
        log "错误: 后端API健康检查失败"
        echo "后端API健康检查失败" | mail -s "应用健康告警" $ALERT_EMAIL
    fi
    
    # 检查前端页面
    if curl -f -s http://localhost > /dev/null; then
        log "前端页面访问正常"
    else
        log "错误: 前端页面访问失败"
        echo "前端页面访问失败" | mail -s "应用健康告警" $ALERT_EMAIL
    fi
}

# 检查数据库连接
check_database() {
    log "检查数据库连接..."
    
    # 检查MySQL
    if docker exec print-ad-mysql mysqladmin ping -h localhost --silent; then
        log "MySQL连接正常"
    else
        log "错误: MySQL连接失败"
        echo "MySQL连接失败" | mail -s "数据库告警" $ALERT_EMAIL
    fi
    
    # 检查Redis
    if docker exec print-ad-redis redis-cli ping | grep -q PONG; then
        log "Redis连接正常"
    else
        log "错误: Redis连接失败"
        echo "Redis连接失败" | mail -s "数据库告警" $ALERT_EMAIL
    fi
}

# 主监控函数
main() {
    log "开始系统监控检查..."
    
    check_containers
    check_disk_space
    check_memory
    check_app_health
    check_database
    
    log "系统监控检查完成"
}

# 执行监控
main